package com.tencent.wxcloudrun.websocket;

/**
 * ClassName: WebSocket
 * Package: com.tencent.wxcloudrun.controller
 * Description:
 *
 * @Date: 2023/4/19 9:51 AM
 * @Author: wht
 */

import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.*;
import javax.websocket.server.PathParam;

import lombok.extern.slf4j.Slf4j;

//@Component
@Slf4j
//@ServerEndpoint("/websocket/{shop_id}/{token}")  // 接口路径 ws://localhost:8087/webSocket/token;
public class WebSocket {

    //与某个客户端的连接会话，需要通过它来给客户端发送数据
    private Session session;
    /**
     * 用户ID
     */
    private String token;

    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。
    //虽然@Component默认是单例模式的，但springboot还是会为每个websocket连接初始化一个bean，所以可以用一个静态set保存起来。
    //  注：底下WebSocket是当前类名
    // 用来存在线连接用户信息
    private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<String, Session>();

    /**
     * 链接成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("shop_id") String shop_id, @PathParam("token") String token) {
        sessionPool.put(shop_id, session);
        log.info("【websocket消息】有新的连接，总数为:" + sessionPool.size());
    }

    /**
     * 链接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        sessionPool.remove(this.token);
        log.info("【websocket消息】连接断开，总数为:" + sessionPool.size());
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("【websocket消息】收到客户端消息:" + message);
    }

    /**
     * 发送错误时的处理
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {

        log.error("用户错误,原因:" + error.getMessage());
        error.printStackTrace();
    }


    // 此为广播消息
//    public void sendAllMessage(String message) {
//        log.info("【websocket消息】广播消息:" + message);
//        for (WebSocket webSocket : webSockets) {
//            try {
//                if (webSocket.session.isOpen()) {
//                    webSocket.session.getAsyncRemote().sendText(message);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }

    // 此为单点消息
    public void sendMessageToOne(String shop_id, String message) {
        Session session = sessionPool.get(shop_id);
        if (session != null && session.isOpen()) {
            try {
                session.getAsyncRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
                log.info("【websocket消息】 单点消息:" + message);
            }
        }
    }

    // 此为单点消息(多人)
//    public void sendMoreMessage(String[] tokens, String message) {
//        for (String token : tokens) {
//            Session session = sessionPool.get(token);
//            if (session != null && session.isOpen()) {
//                try {
//                    log.info("【websocket消息】 单点消息:" + message);
//                    session.getAsyncRemote().sendText(message);
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//
//    }

}
